package fr.eisti.icc.data;


import org.hibernate.annotations.Cascade;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;
import java.util.Map;
import javax.xml.bind.annotation.XmlRootElement;
import javax.xml.bind.annotation.XmlTransient;
import org.codehaus.jackson.annotate.JsonIgnore;

/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */

/**
 *
 * @author clion
 */
@Entity
@Inheritance(strategy=InheritanceType.TABLE_PER_CLASS)
@Table(name="DOCUMENT")
@XmlRootElement
public  class Document implements Serializable {

    @Id
    @GeneratedValue(strategy = GenerationType.TABLE)
    @Column(name="id")
    private int id;
    @Column(name="sujetGen")
    private String sujetGen;
    @Column(name="titre")
    private String titre;
    @ElementCollection
    @Column(name = "LIST_AUTEURS")
    private List<String> listAuteurs;
    @ElementCollection
    @Column(name = "LIST_MOTS_CLES")
    private List<String> motsCles;
    @Column(name="prixAchat")
    private double prixAchat;
    @Column(name="resume")
    private String resume;
    @Column(name="disponiblePourEleve")
    private boolean disponiblePourEleve;
    @Column(name="estDisponible")
    private boolean estDisponible;
    @Column(name="editeur")
    private String editeur;
    @Column(name="anneePublication")
    private String annéePublication;
    @Column(name="etat")
    private int etat; //0=excellent
    @OneToMany(fetch=FetchType.EAGER, cascade={CascadeType.PERSIST, CascadeType.MERGE, CascadeType.REFRESH})
    @Cascade(org.hibernate.annotations.CascadeType.SAVE_UPDATE)
    @JoinColumn(name="id_document_associe")
    private List<Document> docsALireAvant;
    @ElementCollection(fetch=FetchType.EAGER)
    @JoinTable(name = "autres_informations_document",
            joinColumns = @JoinColumn(name = "id"))
    @MapKeyColumn(name = "cle")
    @Column(name = "valeur")
    private Map<String,String> autresInformations;
      
    
    public boolean accept(Filtre f) {
        if (!this.sujetGen.equals(f.getSujetGen()) && f.getSujetGen()!=null) return false;
         if (!this.titre.equals(f.getSujetGen()) && f.getTitre()!=null) return false;
           if (!new Double(this.prixAchat).equals(f.getPrixAchat()) && f.getPrixAchat()!=null) return false;
            if (!this.resume.equals(f.getResume()) && f.getResume()!=null) return false;
            if (!new Boolean(this.disponiblePourEleve).equals(f.getDisponiblePourEleve()) && f.getDisponiblePourEleve()!=null) return false;
            if (!new Boolean(this.estDisponible).equals(f.getEstDisponible()) && f.getEstDisponible()!=null) return false;
             if (!this.editeur.equals(f.getEditeur()) && f.getEditeur()!=null) return false;
              if (!this.annéePublication.equals(f.getAnnéePublication()) && f.getAnnéePublication()!=null) return false;
               if (!new Integer(this.etat).equals(f.getEtat()) && f.getEtat()!=null) return false;
               if ( !motsCles.containsAll(f.getMotsCles())) return false;
                if ( !listAuteurs.containsAll(f.getListAuteurs())) return false;
        return true;
    }
    
    
//    private Map<String,String> autresInformations;


    public Document(String sujetGen, String titre, List<String> listAuteurs, List<String> motsCles, double prixAchat, String resume, boolean disponiblePourEleve, boolean estDisponible, String editeur, String annéePublication, int etat, List<Document> docsALireAvant) {
        this.sujetGen = sujetGen;
        this.titre = titre;
        this.listAuteurs = listAuteurs;
        this.motsCles = motsCles;
        this.prixAchat = prixAchat;
        this.resume = resume;
        this.disponiblePourEleve = disponiblePourEleve;
        this.estDisponible = estDisponible;
        this.editeur = editeur;
        this.annéePublication = annéePublication;
        this.etat = etat;
        this.docsALireAvant = docsALireAvant;
    }

    public Document(){

    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getSugetGen() {
        return sujetGen;
    }

    public void setSugetGen(String sugetGen) {
        this.sujetGen = sugetGen;
    }

    public String getTitre() {
        return titre;
    }

    public void setTitre(String titre) {
        this.titre = titre;
    }

    public List<String> getListAuteurs() {
        return listAuteurs;
    }

    public void setListAuteurs(List<String> listAuteurs) {
        this.listAuteurs = listAuteurs;
    }

    public List<String> getMotsCles() {
        return motsCles;
    }

    public void setMotsCles(List<String> motsCles) {
        this.motsCles = motsCles;
    }

    public double getPrixAchat() {
        return prixAchat;
    }

    public void setPrixAchat(double prixAchat) {
        this.prixAchat = prixAchat;
    }

    public String getResume() {
        return resume;
    }

    public void setResume(String resume) {
        this.resume = resume;
    }

    public boolean isDiponiblePourEleve() {
        return disponiblePourEleve;
    }

    public void setDiponiblePourEleve(boolean diponiblePourEleve) {
        this.disponiblePourEleve = diponiblePourEleve;
    }

    public boolean isEstDisponible() {
        return estDisponible;
    }

    public void setEstDisponible(boolean estDisponible) {
        this.estDisponible = estDisponible;
    }

    public String getEditeur() {
        return editeur;
    }

    public void setEditeur(String editeur) {
        this.editeur = editeur;
    }

    public String getAnnéePublication() {
        return annéePublication;
    }

    public void setAnnéePublication(String annéePublication) {
        this.annéePublication = annéePublication;
    }

    public int getEtat() {
        return etat;
    }

    public void setEtat(int etat) {
        this.etat = etat;
    }

    @XmlTransient
    @JsonIgnore
    public List<Document> getDocsALireAvant() {
        return docsALireAvant;
    }

    public void setDocsALireAvant(List<Document> docsALireAvant) {
        this.docsALireAvant = docsALireAvant;
    }

    public Map<String, String> getAutresInformations() {
        return autresInformations;
    }

    public void setAutresInformations(Map<String, String> autresInformations) {
        this.autresInformations = autresInformations;
    }
    
}
